home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 170_01 / snap.c < prev    next >
Text File  |  1980-01-01  |  3KB  |  99 lines

  1.  
  2.  
  3. /*  Memory snapshot routine written in DeSmet 'C'.
  4.         by Stan Peters, 813 Clara, Palo Alto, 94303.
  5.  
  6.     A debugging tool, useful for examining structures and file data.
  7.     It is also a valuable learning aid for 'C' but requires that 
  8.     you have (or gain) dump reading ability.            
  9.     It should have good portability, as it was first written in BDS 'C'
  10.     for a CP/M system.                           */
  11.  
  12.             
  13.             /* test of snap   */
  14.  
  15. struct stype    {
  16.     char line1[16];
  17.     char line2[16];      
  18.     char line3[16];
  19.     char *p1;                      
  20.     char *p2;            
  21.     char *p3;      
  22.     char *p4;       
  23. } s;
  24.  
  25.      char ss1[9];
  26.      char ss2[9];
  27.      int  s1;
  28.      char ss3[9];
  29.      int  s2;
  30.      int  s3;
  31.      char *ss;
  32.  
  33. main()
  34. {
  35.     for(s1 = 0; s1 <64 ;s1++)
  36.         s.line1[s1] = 1;        /* initialize snap target  */
  37.     strcpy(s.line2,"line2 string");
  38.     snap(s,32,"snap 1");
  39.     strcpy(s.line1,"too long line1 string");
  40.     snap(s,64,"snap 2");
  41.     strcpy (s.line3,s.line1);
  42.     s.p1 = s.line1;
  43.     s.p2 = &s.line1;
  44.     s.p3 = &s.p1;            /* pointer  to string pointer */ 
  45.     s.p4 = *s.p1;            /* illogical, char to ptr      */
  46.     snap(s,72,"snap 3");
  47.  
  48.     strcpy(ss1,"1 string");
  49.     strcpy(ss2,"2 string");
  50.     strcpy(ss3,"3 string");
  51.     s1 = 1;   s2 = 2;  s3 = 3;
  52.     ss = &ss1;
  53.     snap(s,64,"snap 4");
  54. }
  55.  
  56.     /* routine displays memory as hex and characters  */
  57.  
  58. char stst[80];        /* build space for snap line */
  59.  
  60. snap(ptr,len,label) 
  61.     char  *ptr;            /* start of area to be snapped */
  62.     int    len;            /* length */
  63.     char  *label;    
  64. {
  65.     char    c;       
  66.     int        g,    h,    i,    j,    k,    l,    pl;
  67.     pl = ptr + len -1;
  68.     printf("\n%s", label);
  69.   for ( l = 0; l < len; l += 16)
  70.   {
  71.     for (g = 4; g < 80; g++)
  72.         stst[g] = ' ';                    /* clear line */
  73.     sprintf(stst,"\n%04x    ",ptr);        /* address of data  */
  74.     i = 0;    j = 7;    k = 51;
  75.     for ( g=0; g<4; g++)
  76.     {
  77.         for ( h=0; h < 4 && pl >= ptr; h++)
  78.         {
  79.             c = *ptr++;
  80.             stst[j++] = makeasci(( c >> 4) & 0xf); /* left nibble */
  81.             stst[j++] = makeasci( c & 0xf);       /* right nibble */
  82.             if (( c < ' ') || (c > 0x7e))    /* now character representation */
  83.                 c = '.';                    /* . if unprintable    */
  84.             stst[k++] = c;                    /* print it */
  85.          }
  86.          j += 2;                                /* space after every four */
  87.         /*    k++;        insert this to space rt side chars */
  88.     }
  89.     stst[78] = 0;
  90.     puts(stst);
  91.   }
  92. }
  93.  
  94. char    makeasci(c)  
  95.         short    c;
  96.          {
  97.         return (( c > 9 ) ? c + 'A' - 10 : c + '0');
  98.         }
  99.